import java.util.StringJoiner;

/**
 * LearnCoreClass
 */
public class LearnCoreClass {
    public static void main(String[] args) {
        EnumUsed();
    }

    static void StringMethods() {
        // char[] 生成String
        String str = new String(new char[] { 'D', 'O', 'N', 'G' });
        System.out.println(str);

        // 字符串比较(使用 == 对比的是对象引用地址（编译期，会自动把所有相同的字符串当作一个对象放入常量池）)
        var str1 = "DONG";
        System.out.println(str.equals(str1));

        // 常用方法
        System.out.println(str.contains("D")); // 是否包含字符串
        System.out.println(str.lastIndexOf("D")); // 上一个字符索引值
        System.out.println(str.startsWith("D")); // 开始字符串是否为..
        System.out.println(str.endsWith("D")); // 结束字符串是否为..

        // 去除空格
        System.out.println("  \tHello\r\n ".trim()); // 去除英文首尾字符
        System.out.println("  \u3000Hello\u3000".strip()); // 去除中文首尾字符

        // 判空
        System.out.println("".isEmpty()); // true，因为字符串长度为0
        System.out.println("  \n".isBlank()); // true，因为只包含空白字符);

        // 字符串数组拼接
        String[] strs = new String[] { "D", "o", "n", "g" };
        System.out.println(String.join(",", strs));
        // TODO:待补充（https://www.bookstack.cn/read/liaoxuefeng-java/fd8b506dfd9ed1c4.md）
    }

    static void StringBuilderUsed() {
        // 字符串都是临时对象，直接拼接不但浪费内存，还会影响GC效率。
        // StringBuilder 是一个可变对象，可以预分配缓冲区，不会生成新对象
        // 支持链式操作
        StringBuilder sb = new StringBuilder(1024);
        for (int i = 0; i < 10; i++) {
            sb.append("i");
        }
        System.out.println(sb.toString());

        // StringBuffer Java早期的一个StringBuilder的线程安全版本
        // 通过同步来保证多个线程操作StringBuffer也是安全的
        // 不建议使用，同步会带来执行速度的下降
    }

    static void StringJoinerUsed() {
        // StringJoiner 指定字符串拼接
        // 第二、三参数 指定开头和结尾
        StringJoiner sj = new StringJoiner(",", "start:", ":end");
        for (int i = 0; i < 10; i++) {
            sj.add("i");
        }

        System.out.println(sj);
    }

    static void EnumUsed() {
        // Enum 特点：无法被赋值、只能定义Enum实例、定义的每个实例都是引用类型的唯一实例、
        // 可用于Switch
        Weekday day = Weekday.SUM;
        if (day == Weekday.SAT || day == Weekday.SUM) {
            System.out.println("在家休息");
        } else {
            System.out.println("去公司");
        }

        // TODO：常用方法

    }
}

enum Weekday {
    SUM, MON, TUE, WED, THU, FRI, SAT
}